python pandas 中的奇怪错误适用

strange error in python pandas apply

下面的代码给了我一个keyError: 0。如果我删除 [0] 部分,它会起作用。

请注意,我真正想做的是获取组中的每个子数据框,进行一些操作(例如涉及行与列之间的计算),以及 return 一个新的数据框。它类似于 R 中的 ddply 或 data.table groupby 操作。

import pandas as pd
df = pd.DataFrame(dict(a=list('XYXYXYXY'), b=list('AABBCCDD')))
df.groupby('a').apply(lambda x: x['b'][0])

结果:

KeyError                                  Traceback (most recent call last)
<ipython-input-136-7b87ffbc2fd2> in <module>() 
      1 df = pd.DataFrame(dict(a=list('XYXYXYXY'), b=list('AABBCCDD')))
----> 2 df.groupby('a').apply(lambda x: x['b'][0])

由于 [0],您遇到了关键错误。虽然这不是一个完美的描述,但当您指定

df.groupby('a')

您正在为每个分组创建类似(标签、DataFrame)对的迭代器,直到您调用 apply 某些函数才应用于每个 "sub-frames"。例如,

for grp, frame in df.groupby('a'):
    print('Group', grp)
    print(frame)
    print()

Group X
   a  b
0  X  A
2  X  B
4  X  C
6  X  D

Group Y
   a  b
1  Y  A
3  Y  B
5  Y  C
7  Y  D

使用 [0] 将尝试按标签而不是整数位置进行索引,并且您的 DataFrame a == Y 索引为 [1, 3, 5, 7] .换句话说,你正在尝试做:

df2 = df[df.a=='Y']
df2['b'][0]  # Not only is this a key error, it's also chained indexing

您可能会发现这很有用:pandasgroupby 方法实际上是如何工作的?

您的代码的工作版本是

df.groupby('a').apply(lambda x: x.iloc[0,1])

但是你应该更喜欢@juanpa 的解决方案,它在这里会更快。

@BradSolomon 解释了错误的来源。但是,我认为您真正想要的是以下内容:

In [7]: df.groupby('a')['b'].nth(0)
Out[7]:
a
X    A
Y    A
Name: b, dtype: object

如果您喜欢使用 apply

df.groupby('a').b.apply(lambda x: x.values.tolist()[0])
Out[952]: 
a
X    A
Y    A
Name: b, dtype: object

或尝试

df.groupby('a').b.first()
Out[960]: 
a
X    A
Y    A
Name: b, dtype: object